package cn.line5.module;

import java.util.List;

import cn.line5.seam.annotations.In;
import cn.line5.seam.annotations.Name;
import cn.line5.seam.annotations.Transaction;
import cn.line5.seam.db.PageResult;

@Name("moduleService")
/**
 * <h1>模块管理业务层实现类</h1>
 * 
 * @author Liu,Xiaojun
 */
public class ModuleServiceImpl implements ModuleService {
	@In("moduleDao")
	private ModuleDao moduleDao;

	/**
	 * 获取模块的所有列表-递归方法
	 */
	public List<ModuleVo> getModuleList(String parentId) {
		List<ModuleVo> list = moduleDao.getModuleList(parentId != null
				&& !ModuleConstants.ROOT_MODULE_ID.equals(parentId) ? parentId
				: "");
		if (list != null && list.size() > 0)
			for (ModuleVo vo : list)
				if (ModuleConstants.MODULE_TYPE_NODE.equals(vo.getModuleType()))
					vo.setList(getModuleList(vo.getModuleId()));
		return list;
	}
	
	/**
	 * 获取树的JS代码
	 */
	public String getModuleTreeJs() {
		ModuleVo vo = getRootModule();
		return new StringBuffer().append(
				"var tree = new MzTreeView(\"tree\");\n").append(
				"tree.setIconPath(\"../images/MzTree/\");\n").append(
				"tree.nodes[\"-1_").append(vo.getModuleId()).append(
				"\"] = \"text:").append(vo.getModuleName()).append("\";\n")
				.append(getModuleTreeJs(vo.getModuleId())).append(
						"tree.setURL(\"moduleMain.seam\");\n").append(
						"tree.setTarget(\"moduleMain\");\n").append(
						"document.write(tree.toString());\n").toString();
	}

	/**
	 * 模块列表
	 */
	public PageResult<ModuleVo> getModulePageList(String parentId,
			String currentPage) {
		PageResult<ModuleVo> result = moduleDao
				.getModulePageList(
						parentId != null
								&& !ModuleConstants.ROOT_MODULE_ID
										.equals(parentId) ? parentId : "",
						(currentPage != null && currentPage.length() > 0 ? Integer
								.parseInt(currentPage)
								: 1));
		covertModuleList(result.getResultList());
		return result;
	}

	/**
	 * 获取模块信息
	 */
	public ModuleVo getModule(String moduleId) {
		if (moduleId != null && moduleId.length() > 0
				&& !ModuleConstants.ROOT_MODULE_ID.equals(moduleId))
			return covert(moduleDao.getModule(moduleId));
		else
			return covert(getRootModule());
	}

	/**
	 * 添加模块
	 */
	public Boolean addModule(ModuleVo vo) {
		String moduleId = vo.getParentId() != null
				&& !ModuleConstants.ROOT_MODULE_ID.equals(vo.getParentId()) ? vo
				.getParentId()
				: "";
		vo.setModuleSort(moduleDao.getModuleMaxSort(moduleId) + 1);
		String maxId = moduleDao.getModuleMaxId(moduleId);
		int _maxId = Integer.parseInt(maxId.substring(maxId.length() - 3)) + 1;
		if (_maxId > 999)
			return false;
		else if (_maxId > 99)
			moduleId += _maxId;
		else if (_maxId > 9)
			moduleId += "0" + _maxId;
		else
			moduleId += "00" + _maxId;
		vo.setModuleId(moduleId);
		return moduleDao.addModule(vo);
	}

	/**
	 * 修改模块
	 */
	public Boolean modifyModule(ModuleVo vo) {
		return moduleDao.modifyModule(vo);
	}

	/**
	 * 模块向上排序
	 */
	@Transaction
	public Boolean upModule(String moduleId) {
		List<ModuleVo> list = moduleDao.getModuleList(moduleId.substring(0,
				moduleId.length() - 3));
		if (list != null && list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				ModuleVo vo1 = list.get(i);
				if (vo1.getModuleId().equals(moduleId)) {
					if (i > 0) {
						ModuleVo vo2 = list.get(i - 1);
						Integer moduleSort = vo1.getModuleSort();
						vo1.setModuleSort(vo2.getModuleSort());
						vo2.setModuleSort(moduleSort);
						return moduleDao.saveModuleSort(vo1)
								&& moduleDao.saveModuleSort(vo2);
					}
					break;
				}
			}
		}
		return false;
	}

	/**
	 * 模块向下排序
	 */
	@Transaction
	public Boolean downModule(String moduleId) {
		List<ModuleVo> list = moduleDao.getModuleList(moduleId.substring(0,
				moduleId.length() - 3));
		if (list != null && list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				ModuleVo vo1 = list.get(i);
				if (vo1.getModuleId().equals(moduleId)) {
					if (i < list.size() - 1) {
						ModuleVo vo2 = list.get(i + 1);
						Integer moduleSort = vo1.getModuleSort();
						vo1.setModuleSort(vo2.getModuleSort());
						vo2.setModuleSort(moduleSort);
						return moduleDao.saveModuleSort(vo1)
								&& moduleDao.saveModuleSort(vo2);
					}
					break;
				}
			}
		}
		return false;
	}

	/**
	 * 删除模块
	 */
	@Transaction
	public Boolean deleteModule(String[] moduleIds) {
		Boolean t = true;
		for (String moduleId : moduleIds)
			t &= moduleDao.deleteModule(moduleId)
					&& moduleDao.deleteFunctionByModule(moduleId)
					&& moduleDao.deletePointByModule(moduleId);
		return t;
	}

	/**
	 * 功能列表
	 */
	public PageResult<ModuleFunctionVo> getFunctionPageList(String moduleId,
			String currentPage) {
		PageResult<ModuleFunctionVo> result = moduleDao.getFunctionPageList(
				moduleId,
				(currentPage != null && currentPage.length() > 0 ? Integer
						.parseInt(currentPage) : 1));
		covertFunctionList(result.getResultList());
		return result;
	}

	/**
	 * 获取功能信息
	 */
	public ModuleFunctionVo getFunction(String functionId) {
		return covert(moduleDao.getFunction(functionId));
	}

	/**
	 * 添加功能
	 */
	public ModuleFunctionVo addFunction(ModuleFunctionVo vo) {
		vo
				.setFunctionSort(moduleDao.getFunctionMaxSort(vo
						.getFunctionId()) + 1);
		String maxId = moduleDao.getFunctionMaxId(vo.getFunctionId());
		int _maxId = Integer.parseInt(maxId.substring(maxId.length() - 3)) + 1;
		if (_maxId > 999)
			return null;
		else if (_maxId > 99)
			vo.setFunctionId(vo.getFunctionId() + _maxId);
		else if (_maxId > 9)
			vo.setFunctionId(vo.getFunctionId() + "0" + _maxId);
		else
			vo.setFunctionId(vo.getFunctionId() + "00" + _maxId);
		return moduleDao.addFunction(vo) ? vo : null;
	}

	/**
	 * 修改功能
	 */
	public Boolean modifyFunction(ModuleFunctionVo vo) {
		return moduleDao.modifyFunction(vo);
	}

	/**
	 * 功能向上排序
	 */
	@Transaction
	public Boolean upFunction(String functionId) {
		List<ModuleFunctionVo> list = moduleDao.getFunctionList(functionId
				.substring(0, functionId.length() - 3));
		if (list != null && list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				ModuleFunctionVo vo1 = list.get(i);
				if (vo1.getFunctionId().equals(functionId)) {
					if (i > 0) {
						ModuleFunctionVo vo2 = list.get(i - 1);
						Integer pointSort = vo1.getFunctionSort();
						vo1.setFunctionSort(vo2.getFunctionSort());
						vo2.setFunctionSort(pointSort);
						return moduleDao.saveFunctionSort(vo1)
								&& moduleDao.saveFunctionSort(vo2);
					}
					break;
				}
			}
		}
		return false;
	}

	/**
	 * 功能向下排序
	 */
	@Transaction
	public Boolean downFunction(String functionId) {
		List<ModuleFunctionVo> list = moduleDao.getFunctionList(functionId
				.substring(0, functionId.length() - 3));
		if (list != null && list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				ModuleFunctionVo vo1 = list.get(i);
				if (vo1.getFunctionId().equals(functionId)) {
					if (i < list.size() - 1) {
						ModuleFunctionVo vo2 = list.get(i + 1);
						Integer pointSort = vo1.getFunctionSort();
						vo1.setFunctionSort(vo2.getFunctionSort());
						vo2.setFunctionSort(pointSort);
						return moduleDao.saveFunctionSort(vo1)
								&& moduleDao.saveFunctionSort(vo2);
					}
					break;
				}
			}
		}
		return false;
	}

	/**
	 * 删除功能
	 */
	@Transaction
	public Boolean deleteFunction(String[] functionIds) {
		Boolean t = true;
		for (String functionId : functionIds)
			t &= moduleDao.deleteFunction(functionId)
					&& moduleDao.deletePointByModule(functionId);
		return t;
	}
	
	/**
	 * 功能点列表
	 */
	public PageResult<ModuleFunctionPointVo> getPointPageList(String functionId,
			String currentPage) {
		return moduleDao.getPointPageList(
				functionId,
				(currentPage != null && currentPage.length() > 0 ? Integer
						.parseInt(currentPage) : 1));
	}

	/**
	 * 获取功能点信息
	 */
	public ModuleFunctionPointVo getPoint(Integer pointId) {
		return moduleDao.getPoint(pointId);
	}

	/**
	 * 添加功能点
	 */
	public Boolean addPoint(ModuleFunctionPointVo vo) {
		vo.setPointSort(moduleDao.getPointMaxSort(vo.getFunctionId()) + 1);
		return moduleDao.addPoint(vo);
	}

	/**
	 * 修改功能点
	 */
	public Boolean modifyPoint(ModuleFunctionPointVo vo) {
		return moduleDao.modifyPoint(vo);
	}

	/**
	 * 功能点向上排序
	 */
	@Transaction
	public Boolean upPoint(String functionId, Integer pointId) {
		List<ModuleFunctionPointVo> list = moduleDao.getPointList(functionId);
		if (list != null && list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				ModuleFunctionPointVo vo1 = list.get(i);
				if (vo1.getPointId().equals(pointId)) {
					if (i > 0) {
						ModuleFunctionPointVo vo2 = list.get(i - 1);
						Integer pointSort = vo1.getPointSort();
						vo1.setPointSort(vo2.getPointSort());
						vo2.setPointSort(pointSort);
						return moduleDao.savePointSort(vo1)
								&& moduleDao.savePointSort(vo2);
					}
					break;
				}
			}
		}
		return false;
	}

	/**
	 * 功能向下排序
	 */
	@Transaction
	public Boolean downPoint(String functionId, Integer pointId) {
		List<ModuleFunctionPointVo> list = moduleDao.getPointList(functionId);
		if (list != null && list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				ModuleFunctionPointVo vo1 = list.get(i);
				if (vo1.getPointId().equals(pointId)) {
					if (i < list.size() - 1) {
						ModuleFunctionPointVo vo2 = list.get(i + 1);
						Integer pointSort = vo1.getPointSort();
						vo1.setPointSort(vo2.getPointSort());
						vo2.setPointSort(pointSort);
						return moduleDao.savePointSort(vo1)
								&& moduleDao.savePointSort(vo2);
					}
					break;
				}
			}
		}
		return false;
	}

	/**
	 * 删除功能点
	 */
	@Transaction
	public Boolean deletePoint(String[] pointIds) {
		Boolean t = true;
		for (String pointId : pointIds)
			t &= moduleDao.deletePoint(Integer.parseInt(pointId));
		return t;
	}

	/**
	 * 获取根模块信息
	 */
	private ModuleVo getRootModule() {
		ModuleVo vo = new ModuleVo();
		vo.setModuleId(ModuleConstants.ROOT_MODULE_ID);
		vo.setModuleName(ModuleConstants.ROOT_MODULE_NAME);
		vo.setModuleType(ModuleConstants.MODULE_TYPE_NODE);
		vo.setModuleSort(0);
		return vo;
	}

	/**
	 * 组装模块列表信息
	 */
	private List<ModuleVo> covertModuleList(List<ModuleVo> list) {
		for (ModuleVo vo : list)
			covert(vo);
		return list;
	}

	/**
	 * 组装功能列表信息
	 */
	private List<ModuleFunctionVo> covertFunctionList(
			List<ModuleFunctionVo> list) {
		for (ModuleFunctionVo vo : list)
			covert(vo);
		return list;
	}

	/**
	 * 组装模块信息
	 */
	private ModuleVo covert(ModuleVo vo) {
		if (vo == null)
			return null;
		vo.setIsEdit(!ModuleConstants.ROOT_MODULE_ID.equals(vo.getModuleId()));
		if (ModuleConstants.MODULE_TYPE_NODE.equals(vo.getModuleType())) {
			vo.setModuleTypeName(ModuleConstants.MODULE_TYPE_NODE_NAME);
			vo.setIsNode(true);
		} else {
			vo.setModuleTypeName(ModuleConstants.MODULE_TYPE_FUNCTION_NAME);
			vo.setIsNode(false);
		}
		return vo;
	}

	/**
	 * 组装功能信息
	 */
	private ModuleFunctionVo covert(ModuleFunctionVo vo) {
		vo.setModuleId(vo.getFunctionId().substring(0,
				vo.getFunctionId().length() - 3));
		return vo;
	}

	/**
	 * 获取模块树JS代码-递归方法
	 */
	private String getModuleTreeJs(String parentId) {
		StringBuffer sb = new StringBuffer();
		List<ModuleVo> list = moduleDao
				.getModuleList(!ModuleConstants.ROOT_MODULE_ID.equals(parentId) ? parentId
						: "");
		if (list != null && list.size() > 0) {
			for (ModuleVo vo : list) {
				sb.append("tree.nodes[\"").append(parentId).append("_").append(
						vo.getModuleId()).append("\"] = \"text:").append(
						vo.getModuleName()).append("; data:moduleId=").append(
						vo.getModuleId()).append("\";\n");
				if (ModuleConstants.MODULE_TYPE_NODE.equals(vo.getModuleType()))
					sb.append(getModuleTreeJs(vo.getModuleId()));
			}
		}
		return sb.toString();
	}
}
